tg-me.com/mobileproglib/5852
Last Update:
Отложенная инициализация свойств — это механизм, который позволяет отложить инициализацию переменных до момента их первого использования.
Этот вариант позволяет экономить ресурсы, т.к. избегает необходимости создания объектов при инициализации класса.
Модификатор lateinit
говорит о том, что данная переменная будет инициализирована позже. При этом инициализировать свойство можно из любого места, откуда она видна.
Правила использования модификатора lateinit
:lateinit
может использоваться только с var свойствами класса;lateinit
может быть применен только к свойствам, объявленным внутри тела класса (но не в основном конструкторе), а также к переменным на верхнем уровне и локальным переменным;lateinit
свойства могут иметь любой тип, кроме примитивных типов (таких как Int, Long, Double и т.д.);lateinit
свойства не могут быть nullable (т.е. обязательно должно быть объявлены без знака вопроса);lateinit
свойства не могут быть проинициализированы сразу при их объявлении;lateinit
свойства должны быть инициализированы до первого обращения к ним, иначе будет выброшено исключение UninitializedPropertyAccessException
;lateinit
для переменных, определенных внутри локальных областей видимости (например, внутри функций);lateinit
у свойства не должно быть пользовательских геттеров и сеттеров.
Для проверки факта инициализации переменной вызывайте метод isInitialized()
. Функцию следует использовать экономно — не следует добавлять эту проверку к каждой переменной с отложенной инициализацией. Если вы используете isInitialized()
слишком часто, то скорее всего вам лучше использовать тип с поддержкой null.
lateinit var catName: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
catName = "Barsik"
if (::catName.isInitialized) {
Log.d("Kot", "Hi, $catName")
}
}
А вы используете lateinit в своих проектах?
#междусобойчик